🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / app / src / main / java / com / geeksville / mesh / model / UIState.kt
Displaying Raw • Download
app/src/main/java/com/geeksville/mesh/model/UIState.kt ui_message_list (be3f882f) Text, 41.26 KB
T8b949e/*
* Copyright (c) 2025 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787com.geeksville.mesh.model
Tff7b72import T7ee787android.app.Application
Tff7b72import T7ee787android.net.Uri
Tff7b72import T7ee787android.os.RemoteException
Tff7b72import T7ee787androidx.compose.material3.SnackbarDuration
Tff7b72import T7ee787androidx.compose.material3.SnackbarHostState
Tff7b72import T7ee787androidx.compose.material3.SnackbarResult
Tff7b72import T7ee787androidx.lifecycle.LiveData
Tff7b72import T7ee787androidx.lifecycle.ViewModel
Tff7b72import T7ee787androidx.lifecycle.asLiveData
Tff7b72import T7ee787androidx.lifecycle.viewModelScope
Tff7b72import T7ee787com.geeksville.mesh.AdminProtos
Tff7b72import T7ee787com.geeksville.mesh.AppOnlyProtos
Tff7b72import T7ee787com.geeksville.mesh.ChannelProtos
Tff7b72import T7ee787com.geeksville.mesh.ChannelProtos.ChannelSettings
Tff7b72import T7ee787com.geeksville.mesh.ConfigProtos.Config
Tff7b72import T7ee787com.geeksville.mesh.DataPacket
Tff7b72import T7ee787com.geeksville.mesh.IMeshService
Tff7b72import T7ee787com.geeksville.mesh.LocalOnlyProtos.LocalConfig
Tff7b72import T7ee787com.geeksville.mesh.LocalOnlyProtos.LocalModuleConfig
Tff7b72import T7ee787com.geeksville.mesh.MeshProtos
Tff7b72import T7ee787com.geeksville.mesh.Portnums
Tff7b72import T7ee787com.geeksville.mesh.Position
Tff7b72import T7ee787com.geeksville.mesh.R
Tff7b72import T7ee787com.geeksville.mesh.android.Logging
Tff7b72import T7ee787com.geeksville.mesh.android.prefs.UiPrefs
Tff7b72import T7ee787com.geeksville.mesh.channel
Tff7b72import T7ee787com.geeksville.mesh.channelSet
Tff7b72import T7ee787com.geeksville.mesh.channelSettings
Tff7b72import T7ee787com.geeksville.mesh.config
Tff7b72import T7ee787com.geeksville.mesh.copy
Tff7b72import T7ee787com.geeksville.mesh.database.MeshLogRepository
Tff7b72import T7ee787com.geeksville.mesh.database.NodeRepository
Tff7b72import T7ee787com.geeksville.mesh.database.PacketRepository
Tff7b72import T7ee787com.geeksville.mesh.database.QuickChatActionRepository
Tff7b72import T7ee787com.geeksville.mesh.database.entity.MyNodeEntity
Tff7b72import T7ee787com.geeksville.mesh.database.entity.Packet
Tff7b72import T7ee787com.geeksville.mesh.database.entity.QuickChatAction
Tff7b72import T7ee787com.geeksville.mesh.database.entity.asDeviceVersion
Tff7b72import T7ee787com.geeksville.mesh.repository.api.DeviceHardwareRepository
Tff7b72import T7ee787com.geeksville.mesh.repository.api.FirmwareReleaseRepository
Tff7b72import T7ee787com.geeksville.mesh.repository.datastore.RadioConfigRepository
Tff7b72import T7ee787com.geeksville.mesh.repository.location.LocationRepository
Tff7b72import T7ee787com.geeksville.mesh.repository.radio.MeshActivity
Tff7b72import T7ee787com.geeksville.mesh.repository.radio.RadioInterfaceService
Tff7b72import T7ee787com.geeksville.mesh.service.MeshServiceNotifications
Tff7b72import T7ee787com.geeksville.mesh.service.ServiceAction
Tff7b72import T7ee787com.geeksville.mesh.ui.node.components.NodeMenuAction
Tff7b72import T7ee787com.geeksville.mesh.util.getShortDate
Tff7b72import T7ee787com.geeksville.mesh.util.positionToMeter
Tff7b72import T7ee787com.geeksville.mesh.util.safeNumber
Tff7b72import T7ee787dagger.hilt.android.lifecycle.HiltViewModel
Tff7b72import T7ee787kotlinx.coroutines.Dispatchers
Tff7b72import T7ee787kotlinx.coroutines.flow.Flow
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.SharedFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.SharingStarted
Tff7b72import T7ee787kotlinx.coroutines.flow.StateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.asStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.combine
Tff7b72import T7ee787kotlinx.coroutines.flow.filterNotNull
Tff7b72import T7ee787kotlinx.coroutines.flow.first
Tff7b72import T7ee787kotlinx.coroutines.flow.flatMapLatest
Tff7b72import T7ee787kotlinx.coroutines.flow.launchIn
Tff7b72import T7ee787kotlinx.coroutines.flow.map
Tff7b72import T7ee787kotlinx.coroutines.flow.mapNotNull
Tff7b72import T7ee787kotlinx.coroutines.flow.onEach
Tff7b72import T7ee787kotlinx.coroutines.flow.shareIn
Tff7b72import T7ee787kotlinx.coroutines.flow.stateIn
Tff7b72import T7ee787kotlinx.coroutines.flow.update
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787kotlinx.coroutines.withContext
Tff7b72import T7ee787java.io.BufferedWriter
Tff7b72import T7ee787java.io.FileNotFoundException
Tff7b72import T7ee787java.io.FileWriter
Tff7b72import T7ee787java.text.SimpleDateFormat
Tff7b72import T7ee787java.util.Locale
Tff7b72import T7ee787javax.inject.Inject
Tff7b72import T7ee787kotlin.math.roundToInt
T8b949e// Given a human name, strip out the first letter of the first three words and return that as the
T8b949e// initials for
T8b949e// that user, ignoring emojis. If the original name is only one word, strip vowels from the original
T8b949e// name and if the result is 3 or more characters, use the first three characters. If not, just take
T8b949e// the first 3 characters of the original name.
Tff7b72fun Td2a8ffgetInitialsTb4b4b4(Te6edf3fullNameTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3maxInitialLength Tff7b72= T79c0ff4
Tff7b72val Te6edf3minWordCountForInitials Tff7b72= T79c0ff2
Tff7b72val Te6edf3name Tff7b72= Te6edf3fullNameTb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3withoutEmojisTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3words Tff7b72= Te6edf3nameTb4b4b4.Te6edf3splitTb4b4b4(Te6edf3RegexTb4b4b4(Ta5d6ff"Ta5d6ff\\Ta5d6ffs+Ta5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3initials Tff7b72=
Tff7b72when Tb4b4b4(Te6edf3wordsTb4b4b4.Te6edf3sizeTb4b4b4) Tb4b4b4{
Tff7b72in T79c0ff0 Te6edf3until Te6edf3minWordCountForInitials Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3nameWithoutVowels Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3nameTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3nameTb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3nameTb4b4b4.Te6edf3dropTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4.Te6edf3filterNot Tb4b4b4{ Te6edf3c Tff7b72-Tff7b72> Te6edf3cTb4b4b4.Te6edf3lowercaseTb4b4b4(Tb4b4b4) Tff7b72in Ta5d6ff"Ta5d6ffaeiouTa5d6ff" Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Ta5d6ff"Ta5d6ff"
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3nameWithoutVowelsTb4b4b4.Te6edf3length Tff7b72>Tff7b72= Te6edf3maxInitialLengthTb4b4b4) Te6edf3nameWithoutVowels Tff7b72else Te6edf3name
Tb4b4b4}
Tff7b72else Tff7b72-Tff7b72> Te6edf3wordsTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4.Te6edf3joinToStringTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tff7b72return Te6edf3initialsTb4b4b4.Te6edf3takeTb4b4b4(Te6edf3maxInitialLengthTb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Te6edf3StringTb4b4b4.Td2a8ffwithoutEmojisTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657String Tff7b72= Te6edf3filterNot Tb4b4b4{ Te6edf3char Tff7b72-Tff7b72> Te6edf3charTb4b4b4.Te6edf3isSurrogateTb4b4b4(Tb4b4b4) Tb4b4b4}
T8b949e/**
* Builds a [Channel] list from the difference between two [ChannelSettings] lists. Only changes are included in the
* resulting list.
*
* @param new The updated [ChannelSettings] list.
* @param old The current [ChannelSettings] list (required when disabling unused channels).
* @return A [Channel] list containing only the modified channels.
*/
Tff7b72internal Tff7b72fun Td2a8ffgetChannelListTb4b4b4(Te6edf3newTb4b4b4: Te6edf3ListTff7b72<Te6edf3ChannelSettingsTff7b72>Tb4b4b4, Te6edf3oldTb4b4b4: Te6edf3ListTff7b72<Te6edf3ChannelSettingsTff7b72>Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3ChannelProtosTb4b4b4.Te6edf3ChannelTff7b72> Tff7b72=
Te6edf3buildList Tb4b4b4{
Tff7b72for Tb4b4b4(Te6edf3i Tff7b72in T79c0ff0.Tb4b4b4.Te6edf3maxOfTb4b4b4(Te6edf3oldTb4b4b4.Te6edf3lastIndexTb4b4b4, Te6edf3newTb4b4b4.Te6edf3lastIndexTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3oldTb4b4b4.Te6edf3getOrNullTb4b4b4(Te6edf3iTb4b4b4) Tff7b72!Tff7b72= Te6edf3newTb4b4b4.Te6edf3getOrNullTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3addTb4b4b4(
Te6edf3channel Tb4b4b4{
Te6edf3role Tff7b72=
Tff7b72when Tb4b4b4(Te6edf3iTb4b4b4) Tb4b4b4{
T79c0ff0 Tff7b72-Tff7b72> Te6edf3ChannelProtosTb4b4b4.Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3PRIMARY
Tff7b72in T79c0ff1.Tb4b4b4.Te6edf3newTb4b4b4.Te6edf3lastIndex Tff7b72-Tff7b72> Te6edf3ChannelProtosTb4b4b4.Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3SECONDARY
Tff7b72else Tff7b72-Tff7b72> Te6edf3ChannelProtosTb4b4b4.Te6edf3ChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3DISABLED
Tb4b4b4}
Te6edf3index Tff7b72= Te6edf3i
Te6edf3settings Tff7b72= Te6edf3newTb4b4b4.Te6edf3getOrNullTb4b4b4(Te6edf3iTb4b4b4) Tff7b72?: Te6edf3channelSettings Tb4b4b4{Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72data Tff7b72class T56d364NodesUiStateTb4b4b4(
Tff7b72val Te6edf3sortTb4b4b4: Te6edf3NodeSortOption Tff7b72= Te6edf3NodeSortOptionTb4b4b4.Te6edf3LAST_HEARDTb4b4b4,
Tff7b72val Te6edf3filterTb4b4b4: Tffa657String Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Tff7b72val Te6edf3includeUnknownTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tff7b72val Te6edf3onlyOnlineTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tff7b72val Te6edf3onlyDirectTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tff7b72val Te6edf3distanceUnitsTb4b4b4: Tffa657Int Tff7b72= T79c0ff0Tb4b4b4,
Tff7b72val Te6edf3tempInFahrenheitTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tff7b72val Te6edf3showDetailsTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tff7b72val Te6edf3showIgnoredTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72companion Tff7b72object Tb4b4b4{
Tff7b72val Te6edf3Empty Tff7b72= Te6edf3NodesUiStateTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72data Tff7b72class T56d364ContactTb4b4b4(
Tff7b72val Te6edf3contactKeyTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3shortNameTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3longNameTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3lastMessageTimeTb4b4b4: Tffa657String?Tb4b4b4,
Tff7b72val Te6edf3lastMessageTextTb4b4b4: Tffa657String?Tb4b4b4,
Tff7b72val Te6edf3unreadCountTb4b4b4: Tffa657IntTb4b4b4,
Tff7b72val Te6edf3messageCountTb4b4b4: Tffa657IntTb4b4b4,
Tff7b72val Te6edf3isMutedTb4b4b4: Tffa657BooleanTb4b4b4,
Tff7b72val Te6edf3isUnmessageableTb4b4b4: Tffa657BooleanTb4b4b4,
Tff7b72val Te6edf3nodeColorsTb4b4b4: Te6edf3PairTff7b72<Tffa657IntTb4b4b4, Tffa657IntTff7b72>Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4)
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongParameterListTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffLargeClassTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffUnusedPrivatePropertyTa5d6ff"Tb4b4b4)
Tf0883e@HiltViewModel
Tff7b72class T56d364UIViewModel
Tf0883e@Inject
Tff7b72constructorTb4b4b4(
Tff7b72private Tff7b72val Te6edf3appTb4b4b4: Te6edf3ApplicationTb4b4b4,
Tff7b72private Tff7b72val Te6edf3nodeDBTb4b4b4: Te6edf3NodeRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3radioConfigRepositoryTb4b4b4: Te6edf3RadioConfigRepositoryTb4b4b4,
Te6edf3radioInterfaceServiceTb4b4b4: Te6edf3RadioInterfaceServiceTb4b4b4,
Tff7b72private Tff7b72val Te6edf3meshLogRepositoryTb4b4b4: Te6edf3MeshLogRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3deviceHardwareRepositoryTb4b4b4: Te6edf3DeviceHardwareRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3packetRepositoryTb4b4b4: Te6edf3PacketRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3quickChatActionRepositoryTb4b4b4: Te6edf3QuickChatActionRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3locationRepositoryTb4b4b4: Te6edf3LocationRepositoryTb4b4b4,
Te6edf3firmwareReleaseRepositoryTb4b4b4: Te6edf3FirmwareReleaseRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3uiPrefsTb4b4b4: Te6edf3UiPrefsTb4b4b4,
Tff7b72private Tff7b72val Te6edf3meshServiceNotificationsTb4b4b4: Te6edf3MeshServiceNotificationsTb4b4b4,
Tb4b4b4) Tb4b4b4: Te6edf3ViewModelTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3Logging Tb4b4b4{
Tff7b72private Tff7b72val Te6edf3_theme Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3uiPrefsTb4b4b4.Te6edf3themeTb4b4b4)
Tff7b72val Te6edf3themeTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657IntTff7b72> Tff7b72= Te6edf3_themeTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)
Tff7b72fun Td2a8ffsetThemeTb4b4b4(Te6edf3themeTb4b4b4: Tffa657IntTb4b4b4) Tb4b4b4{
Te6edf3_themeTb4b4b4.Te6edf3value Tff7b72= Te6edf3theme
Te6edf3uiPrefsTb4b4b4.Te6edf3theme Tff7b72= Te6edf3theme
Tb4b4b4}
Tff7b72private Tff7b72val Te6edf3_lastTraceRouteTime Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657Long?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72val Te6edf3lastTraceRouteTimeTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657Long?Tff7b72> Tff7b72= Te6edf3_lastTraceRouteTimeTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3_excludedModulesUnlocked Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Tff7b72falseTb4b4b4)
Tff7b72val Te6edf3excludedModulesUnlockedTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657BooleanTff7b72> Tff7b72= Te6edf3_excludedModulesUnlockedTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)
Tff7b72fun Td2a8ffunlockExcludedModulesTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3_excludedModulesUnlockedTb4b4b4.Te6edf3value Tff7b72= Tff7b72true Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3firmwareVersion Tff7b72= Te6edf3myNodeInfoTb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Te6edf3nodeInfo Tff7b72-Tff7b72> Te6edf3nodeInfoTff7b72?.Te6edf3firmwareVersion Tb4b4b4}
Tff7b72val Te6edf3firmwareEdition Tff7b72= Te6edf3meshLogRepositoryTb4b4b4.Te6edf3getMyNodeInfoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3nodeInfo Tff7b72-Tff7b72> Te6edf3nodeInfoTff7b72?.Te6edf3firmwareEdition Tb4b4b4}
Tff7b72val Te6edf3deviceHardwareTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3DeviceHardware?Tff7b72> Tff7b72=
Te6edf3ourNodeInfo
Tb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Te6edf3nodeInfo Tff7b72-Tff7b72>
Te6edf3nodeInfoTff7b72?.Te6edf3userTff7b72?.Te6edf3hwModelTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3hwModel Tff7b72-Tff7b72>
Te6edf3deviceHardwareRepositoryTb4b4b4.Te6edf3getDeviceHardwareByModelTb4b4b4(Te6edf3hwModelTb4b4b4.Te6edf3safeNumberTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3getOrNullTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4.Te6edf3stateInTb4b4b4(Te6edf3scope Tff7b72= Te6edf3viewModelScopeTb4b4b4, Te6edf3started Tff7b72= Te6edf3SharingStartedTb4b4b4.Te6edf3WhileSubscribedTb4b4b4(T79c0ff5Te6edf3_000Tb4b4b4)Tb4b4b4, Te6edf3initialValue Tff7b72= Tff7b72nullTb4b4b4)
Tff7b72val Te6edf3clientNotificationTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3MeshProtosTb4b4b4.Te6edf3ClientNotificationTff7b72?Tff7b72> Tff7b72= Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3clientNotification
Tff7b72fun Td2a8ffclearClientNotificationTb4b4b4(Te6edf3notificationTb4b4b4: Te6edf3MeshProtosTb4b4b4.Te6edf3ClientNotificationTb4b4b4) Tb4b4b4{
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3clearClientNotificationTb4b4b4(Tb4b4b4)
Te6edf3meshServiceNotificationsTb4b4b4.Te6edf3clearClientNotificationTb4b4b4(Te6edf3notificationTb4b4b4)
Tb4b4b4}
T8b949e/**
* Emits events for mesh network send/receive activity. This is a SharedFlow to ensure all events are delivered,
* even if they are the same.
*/
Tff7b72val Te6edf3meshActivityTb4b4b4: Te6edf3SharedFlowTff7b72<Te6edf3MeshActivityTff7b72> Tff7b72=
Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3meshActivityTb4b4b4.Te6edf3shareInTb4b4b4(Te6edf3viewModelScopeTb4b4b4, Te6edf3SharingStartedTb4b4b4.Te6edf3EagerlyTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72data Tff7b72class T56d364AlertDataTb4b4b4(
Tff7b72val Te6edf3titleTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3messageTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Tff7b72val Te6edf3htmlTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Tff7b72val Te6edf3onConfirmTb4b4b4: Tb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Tff7b72val Te6edf3onDismissTb4b4b4: Tb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Tff7b72val Te6edf3choicesTb4b4b4: Te6edf3MapTff7b72<Tffa657StringTb4b4b4, Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTff7b72> Tff7b72= Te6edf3emptyMapTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3_currentAlertTb4b4b4: Te6edf3MutableStateFlowTff7b72<Te6edf3AlertData?Tff7b72> Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72val Te6edf3currentAlert Tff7b72= Te6edf3_currentAlertTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)
Tff7b72fun Td2a8ffshowAlertTb4b4b4(
Te6edf3titleTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3messageTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3htmlTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3onConfirmTb4b4b4: Tb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tff7b72? Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3dismissableTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3choicesTb4b4b4: Te6edf3MapTff7b72<Tffa657StringTb4b4b4, Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTff7b72> Tff7b72= Te6edf3emptyMapTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3_currentAlertTb4b4b4.Te6edf3value Tff7b72=
Te6edf3AlertDataTb4b4b4(
Te6edf3title Tff7b72= Te6edf3titleTb4b4b4,
Te6edf3message Tff7b72= Te6edf3messageTb4b4b4,
Te6edf3html Tff7b72= Te6edf3htmlTb4b4b4,
Te6edf3onConfirm Tff7b72= Tb4b4b4{
Te6edf3onConfirmTff7b72?.Te6edf3invokeTb4b4b4(Tb4b4b4)
Te6edf3dismissAlertTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Tff7b72if Tb4b4b4(Te6edf3dismissableTb4b4b4) Te6edf3dismissAlertTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3choices Tff7b72= Te6edf3choicesTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffdismissAlertTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3_currentAlertTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Tb4b4b4}
Tff7b72private Tff7b72val Te6edf3_title Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72val Te6edf3titleTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657StringTff7b72> Tff7b72= Te6edf3_titleTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)
Tff7b72fun Td2a8ffsetTitleTb4b4b4(Te6edf3titleTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3_titleTb4b4b4.Te6edf3value Tff7b72= Te6edf3title Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3receivingLocationUpdatesTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657BooleanTff7b72>
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3locationRepositoryTb4b4b4.Te6edf3receivingLocationUpdates
Tff7b72val Te6edf3meshServiceTb4b4b4: Te6edf3IMeshService?
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3meshService
Tff7b72private Tff7b72val Te6edf3_localConfig Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3LocalConfigTff7b72>Tb4b4b4(Te6edf3LocalConfigTb4b4b4.Te6edf3getDefaultInstanceTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3localConfigTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3LocalConfigTff7b72> Tff7b72= Te6edf3_localConfig
Tff7b72val Te6edf3config
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3_localConfigTb4b4b4.Te6edf3value
Tff7b72private Tff7b72val Te6edf3_moduleConfig Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3LocalModuleConfigTff7b72>Tb4b4b4(Te6edf3LocalModuleConfigTb4b4b4.Te6edf3getDefaultInstanceTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3moduleConfigTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3LocalModuleConfigTff7b72> Tff7b72= Te6edf3_moduleConfig
Tff7b72val Te6edf3module
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3_moduleConfigTb4b4b4.Te6edf3value
Tff7b72private Tff7b72val Te6edf3_channels Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3channelSet Tb4b4b4{Tb4b4b4}Tb4b4b4)
Tff7b72val Te6edf3channelsTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3AppOnlyProtosTb4b4b4.Te6edf3ChannelSetTff7b72>
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3_channels
Tff7b72val Te6edf3quickChatActions
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72=
Te6edf3quickChatActionRepository
Tb4b4b4.Te6edf3getAllActionsTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3stateInTb4b4b4(Te6edf3viewModelScopeTb4b4b4, Te6edf3SharingStartedTb4b4b4.Te6edf3WhileSubscribedTb4b4b4(T79c0ff5Te6edf3_000Tb4b4b4)Tb4b4b4, Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3nodeFilterText Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3nodeSortOption Tff7b72=
Te6edf3MutableStateFlowTb4b4b4(Te6edf3NodeSortOptionTb4b4b4.Te6edf3entriesTb4b4b4.Te6edf3getOrElseTb4b4b4(Te6edf3uiPrefsTb4b4b4.Te6edf3nodeSortOptionTb4b4b4) Tb4b4b4{ Te6edf3NodeSortOptionTb4b4b4.Te6edf3VIA_FAVORITE Tb4b4b4}Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3includeUnknown Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3uiPrefsTb4b4b4.Te6edf3includeUnknownTb4b4b4)
Tff7b72private Tff7b72val Te6edf3showDetails Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3uiPrefsTb4b4b4.Te6edf3showDetailsTb4b4b4)
Tff7b72private Tff7b72val Te6edf3onlyOnline Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3uiPrefsTb4b4b4.Te6edf3onlyOnlineTb4b4b4)
Tff7b72private Tff7b72val Te6edf3onlyDirect Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3uiPrefsTb4b4b4.Te6edf3onlyDirectTb4b4b4)
Tff7b72private Tff7b72val Te6edf3_showIgnored Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3uiPrefsTb4b4b4.Te6edf3showIgnoredTb4b4b4)
Tff7b72val Te6edf3showIgnoredTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657BooleanTff7b72> Tff7b72= Te6edf3_showIgnored
Tff7b72private Tff7b72val Te6edf3_showQuickChat Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3uiPrefsTb4b4b4.Te6edf3showQuickChatTb4b4b4)
Tff7b72val Te6edf3showQuickChatTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657BooleanTff7b72> Tff7b72= Te6edf3_showQuickChat
Tff7b72private Tff7b72val Te6edf3_hasShownNotPairedWarning Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3uiPrefsTb4b4b4.Te6edf3hasShownNotPairedWarningTb4b4b4)
Tff7b72val Te6edf3hasShownNotPairedWarningTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657BooleanTff7b72> Tff7b72= Te6edf3_hasShownNotPairedWarningTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)
Tff7b72fun Td2a8ffsuppressNoPairedWarningTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3_hasShownNotPairedWarningTb4b4b4.Te6edf3value Tff7b72= Tff7b72true
Te6edf3uiPrefsTb4b4b4.Te6edf3hasShownNotPairedWarning Tff7b72= Tff7b72true
Tb4b4b4}
Tff7b72fun Td2a8fftoggleShowIgnoredTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3toggleTb4b4b4(Te6edf3_showIgnoredTb4b4b4) Tb4b4b4{ Te6edf3uiPrefsTb4b4b4.Te6edf3showIgnored Tff7b72= Tffa657it Tb4b4b4}
Tff7b72fun Td2a8fftoggleShowQuickChatTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3toggleTb4b4b4(Te6edf3_showQuickChatTb4b4b4) Tb4b4b4{ Te6edf3uiPrefsTb4b4b4.Te6edf3showQuickChat Tff7b72= Tffa657it Tb4b4b4}
Tff7b72fun Td2a8ffsetSortOptionTb4b4b4(Te6edf3sortTb4b4b4: Te6edf3NodeSortOptionTb4b4b4) Tb4b4b4{
Te6edf3nodeSortOptionTb4b4b4.Te6edf3value Tff7b72= Te6edf3sort
Te6edf3uiPrefsTb4b4b4.Te6edf3nodeSortOption Tff7b72= Te6edf3sortTb4b4b4.Te6edf3ordinal
Tb4b4b4}
Tff7b72fun Td2a8fftoggleShowDetailsTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3toggleTb4b4b4(Te6edf3showDetailsTb4b4b4) Tb4b4b4{ Te6edf3uiPrefsTb4b4b4.Te6edf3showDetails Tff7b72= Tffa657it Tb4b4b4}
Tff7b72fun Td2a8fftoggleIncludeUnknownTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3toggleTb4b4b4(Te6edf3includeUnknownTb4b4b4) Tb4b4b4{ Te6edf3uiPrefsTb4b4b4.Te6edf3includeUnknown Tff7b72= Tffa657it Tb4b4b4}
Tff7b72fun Td2a8fftoggleOnlyOnlineTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3toggleTb4b4b4(Te6edf3onlyOnlineTb4b4b4) Tb4b4b4{ Te6edf3uiPrefsTb4b4b4.Te6edf3onlyOnline Tff7b72= Tffa657it Tb4b4b4}
Tff7b72fun Td2a8fftoggleOnlyDirectTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3toggleTb4b4b4(Te6edf3onlyDirectTb4b4b4) Tb4b4b4{ Te6edf3uiPrefsTb4b4b4.Te6edf3onlyDirect Tff7b72= Tffa657it Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8fftoggleTb4b4b4(Te6edf3stateTb4b4b4: Te6edf3MutableStateFlowTff7b72<Tffa657BooleanTff7b72>Tb4b4b4, Te6edf3onChangedTb4b4b4: Tb4b4b4(Te6edf3newValueTb4b4b4: Tffa657BooleanTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tb4b4b4(Tff7b72!Te6edf3stateTb4b4b4.Te6edf3valueTb4b4b4)Tb4b4b4.Te6edf3let Tb4b4b4{ Te6edf3toggled Tff7b72-Tff7b72>
Te6edf3stateTb4b4b4.Te6edf3update Tb4b4b4{ Te6edf3toggled Tb4b4b4}
Te6edf3onChangedTb4b4b4(Te6edf3toggledTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72data Tff7b72class T56d364NodeFilterStateTb4b4b4(
Tff7b72val Te6edf3filterTextTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3includeUnknownTb4b4b4: Tffa657BooleanTb4b4b4,
Tff7b72val Te6edf3onlyOnlineTb4b4b4: Tffa657BooleanTb4b4b4,
Tff7b72val Te6edf3onlyDirectTb4b4b4: Tffa657BooleanTb4b4b4,
Tff7b72val Te6edf3showIgnoredTb4b4b4: Tffa657BooleanTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3nodeFilterStateFlowTb4b4b4: Te6edf3FlowTff7b72<Te6edf3NodeFilterStateTff7b72> Tff7b72=
Te6edf3combineTb4b4b4(Te6edf3nodeFilterTextTb4b4b4, Te6edf3includeUnknownTb4b4b4, Te6edf3onlyOnlineTb4b4b4, Te6edf3onlyDirectTb4b4b4, Te6edf3showIgnoredTb4b4b4) Tb4b4b4{
Te6edf3filterTextTb4b4b4,
Te6edf3includeUnknownTb4b4b4,
Te6edf3onlyOnlineTb4b4b4,
Te6edf3onlyDirectTb4b4b4,
Te6edf3showIgnoredTb4b4b4,
Tff7b72-Tff7b72>
Te6edf3NodeFilterStateTb4b4b4(Te6edf3filterTextTb4b4b4, Te6edf3includeUnknownTb4b4b4, Te6edf3onlyOnlineTb4b4b4, Te6edf3onlyDirectTb4b4b4, Te6edf3showIgnoredTb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3nodesUiStateTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3NodesUiStateTff7b72> Tff7b72=
Te6edf3combineTb4b4b4(Te6edf3nodeFilterStateFlowTb4b4b4, Te6edf3nodeSortOptionTb4b4b4, Te6edf3showDetailsTb4b4b4, Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3deviceProfileFlowTb4b4b4) Tb4b4b4{
Te6edf3filterFlowTb4b4b4,
Te6edf3sortTb4b4b4,
Te6edf3showDetailsTb4b4b4,
Te6edf3profileTb4b4b4,
Tff7b72-Tff7b72>
Te6edf3NodesUiStateTb4b4b4(
Te6edf3sort Tff7b72= Te6edf3sortTb4b4b4,
Te6edf3filter Tff7b72= Te6edf3filterFlowTb4b4b4.Te6edf3filterTextTb4b4b4,
Te6edf3includeUnknown Tff7b72= Te6edf3filterFlowTb4b4b4.Te6edf3includeUnknownTb4b4b4,
Te6edf3onlyOnline Tff7b72= Te6edf3filterFlowTb4b4b4.Te6edf3onlyOnlineTb4b4b4,
Te6edf3onlyDirect Tff7b72= Te6edf3filterFlowTb4b4b4.Te6edf3onlyDirectTb4b4b4,
Te6edf3distanceUnits Tff7b72= Te6edf3profileTb4b4b4.Te6edf3configTb4b4b4.Te6edf3displayTb4b4b4.Te6edf3unitsTb4b4b4.Te6edf3numberTb4b4b4,
Te6edf3tempInFahrenheit Tff7b72= Te6edf3profileTb4b4b4.Te6edf3moduleConfigTb4b4b4.Te6edf3telemetryTb4b4b4.Te6edf3environmentDisplayFahrenheitTb4b4b4,
Te6edf3showDetails Tff7b72= Te6edf3showDetailsTb4b4b4,
Te6edf3showIgnored Tff7b72= Te6edf3filterFlowTb4b4b4.Te6edf3showIgnoredTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3stateInTb4b4b4(
Te6edf3scope Tff7b72= Te6edf3viewModelScopeTb4b4b4,
Te6edf3started Tff7b72= Te6edf3SharingStartedTb4b4b4.Te6edf3WhileSubscribedTb4b4b4(T79c0ff5Te6edf3_000Tb4b4b4)Tb4b4b4,
Te6edf3initialValue Tff7b72= Te6edf3NodesUiStateTb4b4b4.Te6edf3EmptyTb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3unfilteredNodeListTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3NodeTff7b72>Tff7b72> Tff7b72=
Te6edf3nodeDB
Tb4b4b4.Te6edf3getNodesTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3stateInTb4b4b4(
Te6edf3scope Tff7b72= Te6edf3viewModelScopeTb4b4b4,
Te6edf3started Tff7b72= Te6edf3SharingStartedTb4b4b4.Te6edf3WhileSubscribedTb4b4b4(T79c0ff5Te6edf3_000Tb4b4b4)Tb4b4b4,
Te6edf3initialValue Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3nodeListTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3NodeTff7b72>Tff7b72> Tff7b72=
Te6edf3nodesUiState
Tb4b4b4.Te6edf3flatMapLatest Tb4b4b4{ Te6edf3state Tff7b72-Tff7b72>
Te6edf3nodeDB
Tb4b4b4.Te6edf3getNodesTb4b4b4(Te6edf3stateTb4b4b4.Te6edf3sortTb4b4b4, Te6edf3stateTb4b4b4.Te6edf3filterTb4b4b4, Te6edf3stateTb4b4b4.Te6edf3includeUnknownTb4b4b4, Te6edf3stateTb4b4b4.Te6edf3onlyOnlineTb4b4b4, Te6edf3stateTb4b4b4.Te6edf3onlyDirectTb4b4b4)
Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3list Tff7b72-Tff7b72> Te6edf3listTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isIgnored Tff7b72=Tff7b72= Te6edf3stateTb4b4b4.Te6edf3showIgnored Tb4b4b4} Tb4b4b4}
Tb4b4b4}
Tb4b4b4.Te6edf3stateInTb4b4b4(
Te6edf3scope Tff7b72= Te6edf3viewModelScopeTb4b4b4,
Te6edf3started Tff7b72= Te6edf3SharingStartedTb4b4b4.Te6edf3WhileSubscribedTb4b4b4(T79c0ff5Te6edf3_000Tb4b4b4)Tb4b4b4,
Te6edf3initialValue Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3onlineNodeCount Tff7b72=
Te6edf3nodeDBTb4b4b4.Te6edf3onlineNodeCountTb4b4b4.Te6edf3stateInTb4b4b4(
Te6edf3scope Tff7b72= Te6edf3viewModelScopeTb4b4b4,
Te6edf3started Tff7b72= Te6edf3SharingStartedTb4b4b4.Te6edf3WhileSubscribedTb4b4b4(T79c0ff5Te6edf3_000Tb4b4b4)Tb4b4b4,
Te6edf3initialValue Tff7b72= T79c0ff0Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3totalNodeCount Tff7b72=
Te6edf3nodeDBTb4b4b4.Te6edf3totalNodeCountTb4b4b4.Te6edf3stateInTb4b4b4(
Te6edf3scope Tff7b72= Te6edf3viewModelScopeTb4b4b4,
Te6edf3started Tff7b72= Te6edf3SharingStartedTb4b4b4.Te6edf3WhileSubscribedTb4b4b4(T79c0ff5Te6edf3_000Tb4b4b4)Tb4b4b4,
Te6edf3initialValue Tff7b72= T79c0ff0Tb4b4b4,
Tb4b4b4)
T8b949e// hardware info about our local device (can be null)
Tff7b72val Te6edf3myNodeInfoTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3MyNodeEntity?Tff7b72>
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3nodeDBTb4b4b4.Te6edf3myNodeInfo
Tff7b72val Te6edf3ourNodeInfoTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3Node?Tff7b72>
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3nodeDBTb4b4b4.Te6edf3ourNodeInfo
Tff7b72fun Td2a8ffgetNodeTb4b4b4(Te6edf3userIdTb4b4b4: Tffa657String?Tb4b4b4) Tff7b72= Te6edf3nodeDBTb4b4b4.Te6edf3getNodeTb4b4b4(Te6edf3userId Tff7b72?: Te6edf3DataPacketTb4b4b4.Te6edf3ID_BROADCASTTb4b4b4)
Tff7b72fun Td2a8ffgetUserTb4b4b4(Te6edf3userIdTb4b4b4: Tffa657String?Tb4b4b4) Tff7b72= Te6edf3nodeDBTb4b4b4.Te6edf3getUserTb4b4b4(Te6edf3userId Tff7b72?: Te6edf3DataPacketTb4b4b4.Te6edf3ID_BROADCASTTb4b4b4)
Tff7b72val Te6edf3snackBarHostState Tff7b72= Te6edf3SnackbarHostStateTb4b4b4(Tb4b4b4)
Tff7b72fun Td2a8ffshowSnackBarTb4b4b4(Te6edf3textTb4b4b4: Tffa657IntTb4b4b4) Tff7b72= Te6edf3showSnackBarTb4b4b4(Te6edf3appTb4b4b4.Te6edf3getStringTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4)
Tff7b72fun Td2a8ffshowSnackBarTb4b4b4(
Te6edf3textTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3actionLabelTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3withDismissActionTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3durationTb4b4b4: Te6edf3SnackbarDuration Tff7b72= Tff7b72if Tb4b4b4(Te6edf3actionLabel Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Te6edf3SnackbarDurationTb4b4b4.Te6edf3Short Tff7b72else Te6edf3SnackbarDurationTb4b4b4.Te6edf3IndefiniteTb4b4b4,
Te6edf3onActionPerformedTb4b4b4: Tb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3onDismissedTb4b4b4: Tb4b4b4(Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tff7b72= Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3snackBarHostStateTb4b4b4.Te6edf3showSnackbarTb4b4b4(Te6edf3textTb4b4b4, Te6edf3actionLabelTb4b4b4, Te6edf3withDismissActionTb4b4b4, Te6edf3durationTb4b4b4)Tb4b4b4.Te6edf3run Tb4b4b4{
Tff7b72when Tb4b4b4(Tff7b72thisTb4b4b4) Tb4b4b4{
Te6edf3SnackbarResultTb4b4b4.Te6edf3ActionPerformed Tff7b72-Tff7b72> Te6edf3onActionPerformedTb4b4b4(Tb4b4b4)
Te6edf3SnackbarResultTb4b4b4.Te6edf3Dismissed Tff7b72-Tff7b72> Te6edf3onDismissedTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72init Tb4b4b4{
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3errorMessage
Tb4b4b4.Te6edf3filterNotNullTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3onEach Tb4b4b4{
Te6edf3showAlertTb4b4b4(
Te6edf3title Tff7b72= Te6edf3appTb4b4b4.Te6edf3getStringTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3client_notificationTb4b4b4)Tb4b4b4,
Te6edf3message Tff7b72= Tffa657itTb4b4b4,
Te6edf3onConfirm Tff7b72= Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3clearErrorMessageTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3dismissable Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3launchInTb4b4b4(Te6edf3viewModelScopeTb4b4b4)
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3localConfigFlowTb4b4b4.Te6edf3onEach Tb4b4b4{ Te6edf3config Tff7b72-Tff7b72> Te6edf3_localConfigTb4b4b4.Te6edf3value Tff7b72= Te6edf3config Tb4b4b4}Tb4b4b4.Te6edf3launchInTb4b4b4(Te6edf3viewModelScopeTb4b4b4)
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3moduleConfigFlow
Tb4b4b4.Te6edf3onEach Tb4b4b4{ Te6edf3config Tff7b72-Tff7b72> Te6edf3_moduleConfigTb4b4b4.Te6edf3value Tff7b72= Te6edf3config Tb4b4b4}
Tb4b4b4.Te6edf3launchInTb4b4b4(Te6edf3viewModelScopeTb4b4b4)
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3channelSetFlow
Tb4b4b4.Te6edf3onEach Tb4b4b4{ Te6edf3channelSet Tff7b72-Tff7b72> Te6edf3_channelsTb4b4b4.Te6edf3value Tff7b72= Te6edf3channelSet Tb4b4b4}
Tb4b4b4.Te6edf3launchInTb4b4b4(Te6edf3viewModelScopeTb4b4b4)
Te6edf3debugTb4b4b4(Ta5d6ff"Ta5d6ffViewModel createdTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3contactList Tff7b72=
Te6edf3combineTb4b4b4(Te6edf3nodeDBTb4b4b4.Te6edf3myNodeInfoTb4b4b4, Te6edf3packetRepositoryTb4b4b4.Te6edf3getContactsTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3channelsTb4b4b4, Te6edf3packetRepositoryTb4b4b4.Te6edf3getContactSettingsTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3myNodeInfoTb4b4b4,
Te6edf3contactsTb4b4b4,
Te6edf3channelSetTb4b4b4,
Te6edf3settingsTb4b4b4,
Tff7b72-Tff7b72>
Tff7b72val Te6edf3myNodeNum Tff7b72= Te6edf3myNodeInfoTff7b72?.Te6edf3myNodeNum Tff7b72?: Tff7b72returnTf0883e@combine Te6edf3emptyListTb4b4b4(Tb4b4b4)
T8b949e// Add empty channel placeholders (always show Broadcast contacts, even when empty)
Tff7b72val Te6edf3placeholder Tff7b72=
Tb4b4b4(T79c0ff0 Te6edf3until Te6edf3channelSetTb4b4b4.Te6edf3settingsCountTb4b4b4)Tb4b4b4.Te6edf3associate Tb4b4b4{ Te6edf3ch Tff7b72-Tff7b72>
Tff7b72val Te6edf3contactKey Tff7b72= Ta5d6ff"Tffd700$Te6edf3chTffd700${Te6edf3DataPacketTb4b4b4.Te6edf3ID_BROADCASTTffd700}Ta5d6ff"
Tff7b72val Te6edf3data Tff7b72= Te6edf3DataPacketTb4b4b4(Te6edf3bytes Tff7b72= Tff7b72nullTb4b4b4, Te6edf3dataType Tff7b72= T79c0ff1Tb4b4b4, Te6edf3time Tff7b72= T79c0ff0LTb4b4b4, Te6edf3channel Tff7b72= Te6edf3chTb4b4b4)
Te6edf3contactKey Te6edf3to Te6edf3PacketTb4b4b4(T79c0ff0LTb4b4b4, Te6edf3myNodeNumTb4b4b4, T79c0ff1Tb4b4b4, Te6edf3contactKeyTb4b4b4, T79c0ff0LTb4b4b4, Tff7b72trueTb4b4b4, Te6edf3dataTb4b4b4)
Tb4b4b4}
Tb4b4b4(Te6edf3contacts Tff7b72+ Tb4b4b4(Te6edf3placeholder Tff7b72- Te6edf3contactsTb4b4b4.Te6edf3keysTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3valuesTb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3packet Tff7b72-Tff7b72>
Tff7b72val Te6edf3data Tff7b72= Te6edf3packetTb4b4b4.Te6edf3data
Tff7b72val Te6edf3contactKey Tff7b72= Te6edf3packetTb4b4b4.Te6edf3contact_key
T8b949e// Determine if this is my message (originated on this device)
Tff7b72val Te6edf3fromLocal Tff7b72= Te6edf3dataTb4b4b4.Te6edf3from Tff7b72=Tff7b72= Te6edf3DataPacketTb4b4b4.Te6edf3ID_LOCAL
Tff7b72val Te6edf3toBroadcast Tff7b72= Te6edf3dataTb4b4b4.Te6edf3to Tff7b72=Tff7b72= Te6edf3DataPacketTb4b4b4.Te6edf3ID_BROADCAST
T8b949e// grab usernames from NodeInfo
Tff7b72val Te6edf3user Tff7b72= Te6edf3getUserTb4b4b4(Tff7b72if Tb4b4b4(Te6edf3fromLocalTb4b4b4) Te6edf3dataTb4b4b4.Te6edf3to Tff7b72else Te6edf3dataTb4b4b4.Te6edf3fromTb4b4b4)
Tff7b72val Te6edf3node Tff7b72= Te6edf3getNodeTb4b4b4(Tff7b72if Tb4b4b4(Te6edf3fromLocalTb4b4b4) Te6edf3dataTb4b4b4.Te6edf3to Tff7b72else Te6edf3dataTb4b4b4.Te6edf3fromTb4b4b4)
Tff7b72val Te6edf3shortName Tff7b72= Te6edf3userTb4b4b4.Te6edf3shortName
Tff7b72val Te6edf3longName Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3toBroadcastTb4b4b4) Tb4b4b4{
Te6edf3channelSetTb4b4b4.Te6edf3getChannelTb4b4b4(Te6edf3dataTb4b4b4.Te6edf3channelTb4b4b4)Tff7b72?.Te6edf3name Tff7b72?: Te6edf3appTb4b4b4.Te6edf3getStringTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_nameTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3userTb4b4b4.Te6edf3longName
Tb4b4b4}
Te6edf3ContactTb4b4b4(
Te6edf3contactKey Tff7b72= Te6edf3contactKeyTb4b4b4,
Te6edf3shortName Tff7b72= Tff7b72if Tb4b4b4(Te6edf3toBroadcastTb4b4b4) Ta5d6ff"Tffd700${Te6edf3dataTb4b4b4.Te6edf3channelTffd700}Ta5d6ff" Tff7b72else Te6edf3shortNameTb4b4b4,
Te6edf3longName Tff7b72= Te6edf3longNameTb4b4b4,
Te6edf3lastMessageTime Tff7b72= Te6edf3getShortDateTb4b4b4(Te6edf3dataTb4b4b4.Te6edf3timeTb4b4b4)Tb4b4b4,
Te6edf3lastMessageText Tff7b72= Tff7b72if Tb4b4b4(Te6edf3fromLocalTb4b4b4) Te6edf3dataTb4b4b4.Te6edf3text Tff7b72else Ta5d6ff"Tffd700$Te6edf3shortNameTa5d6ff: Tffd700${Te6edf3dataTb4b4b4.Te6edf3textTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3unreadCount Tff7b72= Te6edf3packetRepositoryTb4b4b4.Te6edf3getUnreadCountTb4b4b4(Te6edf3contactKeyTb4b4b4)Tb4b4b4,
Te6edf3messageCount Tff7b72= Te6edf3packetRepositoryTb4b4b4.Te6edf3getMessageCountTb4b4b4(Te6edf3contactKeyTb4b4b4)Tb4b4b4,
Te6edf3isMuted Tff7b72= Te6edf3settingsTff7b72[Te6edf3contactKeyTff7b72]Tff7b72?.Te6edf3isMuted Tff7b72=Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3isUnmessageable Tff7b72= Te6edf3userTb4b4b4.Te6edf3isUnmessagableTb4b4b4,
Te6edf3nodeColors Tff7b72=
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3toBroadcastTb4b4b4) Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3colors
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4.Te6edf3stateInTb4b4b4(
Te6edf3scope Tff7b72= Te6edf3viewModelScopeTb4b4b4,
Te6edf3started Tff7b72= Te6edf3SharingStartedTb4b4b4.Te6edf3WhileSubscribedTb4b4b4(T79c0ff5Te6edf3_000Tb4b4b4)Tb4b4b4,
Te6edf3initialValue Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72fun Td2a8ffgetMessagesFromTb4b4b4(Te6edf3contactKeyTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3MessageTff7b72>Tff7b72> Tb4b4b4{
Te6edf3contactKeyForMessagesTb4b4b4.Te6edf3value Tff7b72= Te6edf3contactKey
Tff7b72return Te6edf3messagesForContactKey
Tb4b4b4}
Tff7b72private Tff7b72val Te6edf3contactKeyForMessagesTb4b4b4: Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72> Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72private Tff7b72val Te6edf3messagesForContactKeyTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3MessageTff7b72>Tff7b72> Tff7b72=
Te6edf3contactKeyForMessages
Tb4b4b4.Te6edf3filterNotNullTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3flatMapLatest Tb4b4b4{ Te6edf3contactKey Tff7b72-Tff7b72> Te6edf3packetRepositoryTb4b4b4.Te6edf3getMessagesFromTb4b4b4(Te6edf3contactKeyTb4b4b4, Tff7b72::Te6edf3getNodeTb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3stateInTb4b4b4(
Te6edf3scope Tff7b72= Te6edf3viewModelScopeTb4b4b4,
Te6edf3started Tff7b72= Te6edf3SharingStartedTb4b4b4.Te6edf3WhileSubscribedTb4b4b4(T79c0ff5Te6edf3_000Tb4b4b4)Tb4b4b4,
Te6edf3initialValue Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72fun Td2a8ffgeneratePacketIdTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657Int? Tb4b4b4{
Tff7b72return Tff7b72try Tb4b4b4{
Te6edf3meshServiceTff7b72?.Te6edf3packetId
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3RemoteExceptionTb4b4b4) Tb4b4b4{
Te6edf3errormsgTb4b4b4(Ta5d6ff"Ta5d6ffRemoteException: Tffd700${Te6edf3exTb4b4b4.Te6edf3messageTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72return Tff7b72null
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffsendMessageTb4b4b4(Te6edf3strTb4b4b4: Tffa657StringTb4b4b4, Te6edf3contactKeyTb4b4b4: Tffa657String Tff7b72= Ta5d6ff"Ta5d6ff0Tffd700${Te6edf3DataPacketTb4b4b4.Te6edf3ID_BROADCASTTffd700}Ta5d6ff"Tb4b4b4, Te6edf3replyIdTb4b4b4: Tffa657Int? Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
T8b949e// contactKey: unique contact key filter (channel)+(nodeId)
Tff7b72val Te6edf3channel Tff7b72= Te6edf3contactKeyTff7b72[T79c0ff0Tff7b72]Tb4b4b4.Te6edf3digitToIntOrNullTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3dest Tff7b72= Tff7b72if Tb4b4b4(Te6edf3channel Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Te6edf3contactKeyTb4b4b4.Te6edf3substringTb4b4b4(T79c0ff1Tb4b4b4) Tff7b72else Te6edf3contactKey
T8b949e// if the destination is a node, we need to ensure it's a
T8b949e// favorite so it does not get removed from the on-device node database.
Tff7b72if Tb4b4b4(Te6edf3channel Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{ T8b949e// no channel specified, so we assume it's a direct message
Tff7b72val Te6edf3node Tff7b72= Te6edf3nodeDBTb4b4b4.Te6edf3getNodeTb4b4b4(Te6edf3destTb4b4b4)
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3nodeTb4b4b4.Te6edf3isFavoriteTb4b4b4) Tb4b4b4{
Te6edf3favoriteNodeTb4b4b4(Te6edf3nodeDBTb4b4b4.Te6edf3getNodeTb4b4b4(Te6edf3destTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3p Tff7b72= Te6edf3DataPacketTb4b4b4(Te6edf3destTb4b4b4, Te6edf3channel Tff7b72?: T79c0ff0Tb4b4b4, Te6edf3strTb4b4b4, Te6edf3replyIdTb4b4b4)
Te6edf3sendDataPacketTb4b4b4(Te6edf3pTb4b4b4)
Tb4b4b4}
Tff7b72fun Td2a8ffsendWaypointTb4b4b4(Te6edf3wptTb4b4b4: Te6edf3MeshProtosTb4b4b4.Te6edf3WaypointTb4b4b4, Te6edf3contactKeyTb4b4b4: Tffa657String Tff7b72= Ta5d6ff"Ta5d6ff0Tffd700${Te6edf3DataPacketTb4b4b4.Te6edf3ID_BROADCASTTffd700}Ta5d6ff"Tb4b4b4) Tb4b4b4{
T8b949e// contactKey: unique contact key filter (channel)+(nodeId)
Tff7b72val Te6edf3channel Tff7b72= Te6edf3contactKeyTff7b72[T79c0ff0Tff7b72]Tb4b4b4.Te6edf3digitToIntOrNullTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3dest Tff7b72= Tff7b72if Tb4b4b4(Te6edf3channel Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Te6edf3contactKeyTb4b4b4.Te6edf3substringTb4b4b4(T79c0ff1Tb4b4b4) Tff7b72else Te6edf3contactKey
Tff7b72val Te6edf3p Tff7b72= Te6edf3DataPacketTb4b4b4(Te6edf3destTb4b4b4, Te6edf3channel Tff7b72?: T79c0ff0Tb4b4b4, Te6edf3wptTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3wptTb4b4b4.Te6edf3id Tff7b72!Tff7b72= T79c0ff0Tb4b4b4) Te6edf3sendDataPacketTb4b4b4(Te6edf3pTb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffsendDataPacketTb4b4b4(Te6edf3pTb4b4b4: Te6edf3DataPacketTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3meshServiceTff7b72?.Te6edf3sendTb4b4b4(Te6edf3pTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3RemoteExceptionTb4b4b4) Tb4b4b4{
Te6edf3errormsgTb4b4b4(Ta5d6ff"Ta5d6ffSend DataPacket error: Tffd700${Te6edf3exTb4b4b4.Te6edf3messageTffd700}Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffsendReactionTb4b4b4(Te6edf3emojiTb4b4b4: Tffa657StringTb4b4b4, Te6edf3replyIdTb4b4b4: Tffa657IntTb4b4b4, Te6edf3contactKeyTb4b4b4: Tffa657StringTb4b4b4) Tff7b72= Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3onServiceActionTb4b4b4(Te6edf3ServiceActionTb4b4b4.Te6edf3ReactionTb4b4b4(Te6edf3emojiTb4b4b4, Te6edf3replyIdTb4b4b4, Te6edf3contactKeyTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72val Te6edf3_sharedContactRequestedTb4b4b4: Te6edf3MutableStateFlowTff7b72<Te6edf3AdminProtosTb4b4b4.Te6edf3SharedContactTff7b72?Tff7b72> Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72val Te6edf3sharedContactRequestedTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3AdminProtosTb4b4b4.Te6edf3SharedContactTff7b72?Tff7b72>
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3_sharedContactRequestedTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)
Tff7b72fun Td2a8ffsetSharedContactRequestedTb4b4b4(Te6edf3sharedContactTb4b4b4: Te6edf3AdminProtosTb4b4b4.Te6edf3SharedContactTff7b72?Tb4b4b4) Tb4b4b4{
Te6edf3_sharedContactRequestedTb4b4b4.Te6edf3value Tff7b72= Te6edf3sharedContact
Tb4b4b4}
Tff7b72fun Td2a8ffaddSharedContactTb4b4b4(Te6edf3sharedContactTb4b4b4: Te6edf3AdminProtosTb4b4b4.Te6edf3SharedContactTb4b4b4) Tff7b72=
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3onServiceActionTb4b4b4(Te6edf3ServiceActionTb4b4b4.Te6edf3AddSharedContactTb4b4b4(Te6edf3sharedContactTb4b4b4)Tb4b4b4) Tb4b4b4}
Tff7b72fun Td2a8ffrequestTracerouteTb4b4b4(Te6edf3destNumTb4b4b4: Tffa657IntTb4b4b4) Tb4b4b4{
Te6edf3infoTb4b4b4(Ta5d6ff"Ta5d6ffRequesting traceroute for 'Tffd700$Te6edf3destNumTa5d6ff'Ta5d6ff"Tb4b4b4)
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3packetId Tff7b72= Te6edf3meshServiceTff7b72?.Te6edf3packetId Tff7b72?: Tff7b72return
Te6edf3meshServiceTff7b72?.Te6edf3requestTracerouteTb4b4b4(Te6edf3packetIdTb4b4b4, Te6edf3destNumTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3RemoteExceptionTb4b4b4) Tb4b4b4{
Te6edf3errormsgTb4b4b4(Ta5d6ff"Ta5d6ffRequest traceroute error: Tffd700${Te6edf3exTb4b4b4.Te6edf3messageTffd700}Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffremoveNodeTb4b4b4(Te6edf3nodeNumTb4b4b4: Tffa657IntTb4b4b4) Tff7b72= Te6edf3viewModelScopeTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3IOTb4b4b4) Tb4b4b4{
Te6edf3infoTb4b4b4(Ta5d6ff"Ta5d6ffRemoving node 'Tffd700$Te6edf3nodeNumTa5d6ff'Ta5d6ff"Tb4b4b4)
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3packetId Tff7b72= Te6edf3meshServiceTff7b72?.Te6edf3packetId Tff7b72?: Tff7b72returnTf0883e@launch
Te6edf3meshServiceTff7b72?.Te6edf3removeByNodenumTb4b4b4(Te6edf3packetIdTb4b4b4, Te6edf3nodeNumTb4b4b4)
Te6edf3nodeDBTb4b4b4.Te6edf3deleteNodeTb4b4b4(Te6edf3nodeNumTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3RemoteExceptionTb4b4b4) Tb4b4b4{
Te6edf3errormsgTb4b4b4(Ta5d6ff"Ta5d6ffRemove node error: Tffd700${Te6edf3exTb4b4b4.Te6edf3messageTffd700}Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffrequestUserInfoTb4b4b4(Te6edf3destNumTb4b4b4: Tffa657IntTb4b4b4) Tb4b4b4{
Te6edf3infoTb4b4b4(Ta5d6ff"Ta5d6ffRequesting UserInfo for 'Tffd700$Te6edf3destNumTa5d6ff'Ta5d6ff"Tb4b4b4)
Tff7b72try Tb4b4b4{
Te6edf3meshServiceTff7b72?.Te6edf3requestUserInfoTb4b4b4(Te6edf3destNumTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3RemoteExceptionTb4b4b4) Tb4b4b4{
Te6edf3errormsgTb4b4b4(Ta5d6ff"Ta5d6ffRequest NodeInfo error: Tffd700${Te6edf3exTb4b4b4.Te6edf3messageTffd700}Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffrequestPositionTb4b4b4(Te6edf3destNumTb4b4b4: Tffa657IntTb4b4b4, Te6edf3positionTb4b4b4: Te6edf3Position Tff7b72= Te6edf3PositionTb4b4b4(T79c0ff0.0Tb4b4b4, T79c0ff0.0Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3infoTb4b4b4(Ta5d6ff"Ta5d6ffRequesting position for 'Tffd700$Te6edf3destNumTa5d6ff'Ta5d6ff"Tb4b4b4)
Tff7b72try Tb4b4b4{
Te6edf3meshServiceTff7b72?.Te6edf3requestPositionTb4b4b4(Te6edf3destNumTb4b4b4, Te6edf3positionTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3RemoteExceptionTb4b4b4) Tb4b4b4{
Te6edf3errormsgTb4b4b4(Ta5d6ff"Ta5d6ffRequest position error: Tffd700${Te6edf3exTb4b4b4.Te6edf3messageTffd700}Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffsetMuteUntilTb4b4b4(Te6edf3contactsTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4, Te6edf3untilTb4b4b4: Tffa657LongTb4b4b4) Tff7b72=
Te6edf3viewModelScopeTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3IOTb4b4b4) Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3setMuteUntilTb4b4b4(Te6edf3contactsTb4b4b4, Te6edf3untilTb4b4b4) Tb4b4b4}
Tff7b72fun Td2a8ffdeleteContactsTb4b4b4(Te6edf3contactsTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4) Tff7b72=
Te6edf3viewModelScopeTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3IOTb4b4b4) Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3deleteContactsTb4b4b4(Te6edf3contactsTb4b4b4) Tb4b4b4}
Tff7b72fun Td2a8ffdeleteMessagesTb4b4b4(Te6edf3uuidListTb4b4b4: Te6edf3ListTff7b72<Tffa657LongTff7b72>Tb4b4b4) Tff7b72=
Te6edf3viewModelScopeTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3IOTb4b4b4) Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3deleteMessagesTb4b4b4(Te6edf3uuidListTb4b4b4) Tb4b4b4}
Tff7b72fun Td2a8ffdeleteWaypointTb4b4b4(Te6edf3idTb4b4b4: Tffa657IntTb4b4b4) Tff7b72= Te6edf3viewModelScopeTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3IOTb4b4b4) Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3deleteWaypointTb4b4b4(Te6edf3idTb4b4b4) Tb4b4b4}
Tff7b72fun Td2a8ffclearUnreadCountTb4b4b4(Te6edf3contactTb4b4b4: Tffa657StringTb4b4b4, Te6edf3timestampTb4b4b4: Tffa657LongTb4b4b4) Tff7b72= Te6edf3viewModelScopeTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3IOTb4b4b4) Tb4b4b4{
Te6edf3packetRepositoryTb4b4b4.Te6edf3clearUnreadCountTb4b4b4(Te6edf3contactTb4b4b4, Te6edf3timestampTb4b4b4)
Tff7b72val Te6edf3unreadCount Tff7b72= Te6edf3packetRepositoryTb4b4b4.Te6edf3getUnreadCountTb4b4b4(Te6edf3contactTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3unreadCount Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Te6edf3meshServiceNotificationsTb4b4b4.Te6edf3cancelMessageNotificationTb4b4b4(Te6edf3contactTb4b4b4)
Tb4b4b4}
T8b949e// Connection state to our radio device
Tff7b72val Te6edf3connectionState
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3connectionState
Tff7b72val Te6edf3isConnectedStateFlow Tff7b72=
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3connectionState
Tb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isConnectedTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3stateInTb4b4b4(Te6edf3viewModelScopeTb4b4b4, Te6edf3SharingStartedTb4b4b4.Te6edf3EagerlyTb4b4b4, Tff7b72falseTb4b4b4)
Tff7b72private Tff7b72val Te6edf3_requestChannelSet Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3AppOnlyProtosTb4b4b4.Te6edf3ChannelSetTff7b72?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72val Te6edf3requestChannelSetTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3AppOnlyProtosTb4b4b4.Te6edf3ChannelSetTff7b72?Tff7b72>
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3_requestChannelSet
Tff7b72fun Td2a8ffrequestChannelUrlTb4b4b4(Te6edf3urlTb4b4b4: Te6edf3UriTb4b4b4) Tff7b72= Te6edf3runCatching Tb4b4b4{ Te6edf3_requestChannelSetTb4b4b4.Te6edf3value Tff7b72= Te6edf3urlTb4b4b4.Te6edf3toChannelSetTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3onFailure Tb4b4b4{ Te6edf3ex Tff7b72-Tff7b72>
Te6edf3errormsgTb4b4b4(Ta5d6ff"Ta5d6ffChannel url error: Tffd700${Te6edf3exTb4b4b4.Te6edf3messageTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3showSnackBarTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_invalidTb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3latestStableFirmwareRelease Tff7b72= Te6edf3firmwareReleaseRepositoryTb4b4b4.Te6edf3stableReleaseTb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Tffa657itTff7b72?.Te6edf3asDeviceVersionTb4b4b4(Tb4b4b4) Tb4b4b4}
T8b949e/** Called immediately after activity observes requestChannelUrl */
Tff7b72fun Td2a8ffclearRequestChannelUrlTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3_requestChannelSetTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Tb4b4b4}
Tff7b72var Te6edf3txEnabledTb4b4b4: Tffa657Boolean
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3configTb4b4b4.Te6edf3loraTb4b4b4.Te6edf3txEnabled
Tff7b72setTb4b4b4(Te6edf3valueTb4b4b4) Tb4b4b4{
Te6edf3updateLoraConfig Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3copy Tb4b4b4{ Te6edf3txEnabled Tff7b72= Te6edf3value Tb4b4b4} Tb4b4b4}
Tb4b4b4}
Tff7b72var Te6edf3regionTb4b4b4: Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4.Te6edf3RegionCode
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3configTb4b4b4.Te6edf3loraTb4b4b4.Te6edf3region
Tff7b72setTb4b4b4(Te6edf3valueTb4b4b4) Tb4b4b4{
Te6edf3updateLoraConfig Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3copy Tb4b4b4{ Te6edf3region Tff7b72= Te6edf3value Tb4b4b4} Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8fffavoriteNodeTb4b4b4(Te6edf3nodeTb4b4b4: Te6edf3NodeTb4b4b4) Tff7b72= Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3onServiceActionTb4b4b4(Te6edf3ServiceActionTb4b4b4.Te6edf3FavoriteTb4b4b4(Te6edf3nodeTb4b4b4)Tb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3RemoteExceptionTb4b4b4) Tb4b4b4{
Te6edf3errormsgTb4b4b4(Ta5d6ff"Ta5d6ffFavorite node error:Ta5d6ff"Tb4b4b4, Te6edf3exTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffignoreNodeTb4b4b4(Te6edf3nodeTb4b4b4: Te6edf3NodeTb4b4b4) Tff7b72= Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3onServiceActionTb4b4b4(Te6edf3ServiceActionTb4b4b4.Te6edf3IgnoreTb4b4b4(Te6edf3nodeTb4b4b4)Tb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3RemoteExceptionTb4b4b4) Tb4b4b4{
Te6edf3errormsgTb4b4b4(Ta5d6ff"Ta5d6ffIgnore node error:Ta5d6ff"Tb4b4b4, Te6edf3exTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffhandleNodeMenuActionTb4b4b4(Te6edf3actionTb4b4b4: Te6edf3NodeMenuActionTb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4(Te6edf3actionTb4b4b4) Tb4b4b4{
Tff7b72is Te6edf3NodeMenuActionTb4b4b4.Te6edf3Remove Tff7b72-Tff7b72> Te6edf3removeNodeTb4b4b4(Te6edf3actionTb4b4b4.Te6edf3nodeTb4b4b4.Te6edf3numTb4b4b4)
Tff7b72is Te6edf3NodeMenuActionTb4b4b4.Te6edf3Ignore Tff7b72-Tff7b72> Te6edf3ignoreNodeTb4b4b4(Te6edf3actionTb4b4b4.Te6edf3nodeTb4b4b4)
Tff7b72is Te6edf3NodeMenuActionTb4b4b4.Te6edf3Favorite Tff7b72-Tff7b72> Te6edf3favoriteNodeTb4b4b4(Te6edf3actionTb4b4b4.Te6edf3nodeTb4b4b4)
Tff7b72is Te6edf3NodeMenuActionTb4b4b4.Te6edf3RequestUserInfo Tff7b72-Tff7b72> Te6edf3requestUserInfoTb4b4b4(Te6edf3actionTb4b4b4.Te6edf3nodeTb4b4b4.Te6edf3numTb4b4b4)
Tff7b72is Te6edf3NodeMenuActionTb4b4b4.Te6edf3RequestPosition Tff7b72-Tff7b72> Te6edf3requestPositionTb4b4b4(Te6edf3actionTb4b4b4.Te6edf3nodeTb4b4b4.Te6edf3numTb4b4b4)
Tff7b72is Te6edf3NodeMenuActionTb4b4b4.Te6edf3TraceRoute Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3requestTracerouteTb4b4b4(Te6edf3actionTb4b4b4.Te6edf3nodeTb4b4b4.Te6edf3numTb4b4b4)
Te6edf3_lastTraceRouteTimeTb4b4b4.Te6edf3value Tff7b72= Te6edf3SystemTb4b4b4.Te6edf3currentTimeMillisTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72else Tff7b72-Tff7b72> Tb4b4b4{Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffsetNodeNotesTb4b4b4(Te6edf3nodeNumTb4b4b4: Tffa657IntTb4b4b4, Te6edf3notesTb4b4b4: Tffa657StringTb4b4b4) Tff7b72= Te6edf3viewModelScopeTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3IOTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3nodeDBTb4b4b4.Te6edf3setNodeNotesTb4b4b4(Te6edf3nodeNumTb4b4b4, Te6edf3notesTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3javaTb4b4b4.Te6edf3ioTb4b4b4.Te6edf3IOExceptionTb4b4b4) Tb4b4b4{
Te6edf3errormsgTb4b4b4(Ta5d6ff"Ta5d6ffSet node notes IO error: Tffd700${Te6edf3exTb4b4b4.Te6edf3messageTffd700}Ta5d6ff"Tb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3javaTb4b4b4.Te6edf3sqlTb4b4b4.Te6edf3SQLExceptionTb4b4b4) Tb4b4b4{
Te6edf3errormsgTb4b4b4(Ta5d6ff"Ta5d6ffSet node notes SQL error: Tffd700${Te6edf3exTb4b4b4.Te6edf3messageTffd700}Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
T8b949e// managed mode disables all access to configuration
Tff7b72val Te6edf3isManagedTb4b4b4: Tffa657Boolean
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3configTb4b4b4.Te6edf3deviceTb4b4b4.Te6edf3isManaged Tff7b72|Tff7b72| Te6edf3configTb4b4b4.Te6edf3securityTb4b4b4.Te6edf3isManaged
Tff7b72val Te6edf3myNodeNum
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3myNodeInfoTb4b4b4.Te6edf3valueTff7b72?.Te6edf3myNodeNum
Tff7b72val Te6edf3maxChannels
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3myNodeInfoTb4b4b4.Te6edf3valueTff7b72?.Te6edf3maxChannels Tff7b72?: T79c0ff8
Tff7b72override Tff7b72fun Td2a8ffonClearedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72superTb4b4b4.Te6edf3onClearedTb4b4b4(Tb4b4b4)
Te6edf3debugTb4b4b4(Ta5d6ff"Ta5d6ffViewModel clearedTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72inline Tff7b72fun Td2a8ffupdateLoraConfigTb4b4b4(Te6edf3crossinline Te6edf3bodyTb4b4b4: Tb4b4b4(Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4) Tff7b72-Tff7b72> Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3data Tff7b72= Te6edf3bodyTb4b4b4(Te6edf3configTb4b4b4.Te6edf3loraTb4b4b4)
Te6edf3setConfigTb4b4b4(Te6edf3config Tb4b4b4{ Te6edf3lora Tff7b72= Te6edf3data Tb4b4b4}Tb4b4b4)
Tb4b4b4}
T8b949e// Set the radio config (also updates our saved copy in preferences)
Tff7b72fun Td2a8ffsetConfigTb4b4b4(Te6edf3configTb4b4b4: Te6edf3ConfigTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3meshServiceTff7b72?.Te6edf3setConfigTb4b4b4(Te6edf3configTb4b4b4.Te6edf3toByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3RemoteExceptionTb4b4b4) Tb4b4b4{
Te6edf3errormsgTb4b4b4(Ta5d6ff"Ta5d6ffSet config error:Ta5d6ff"Tb4b4b4, Te6edf3exTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffsetChannelTb4b4b4(Te6edf3channelTb4b4b4: Te6edf3ChannelProtosTb4b4b4.Te6edf3ChannelTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3meshServiceTff7b72?.Te6edf3setChannelTb4b4b4(Te6edf3channelTb4b4b4.Te6edf3toByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3RemoteExceptionTb4b4b4) Tb4b4b4{
Te6edf3errormsgTb4b4b4(Ta5d6ff"Ta5d6ffSet channel error:Ta5d6ff"Tb4b4b4, Te6edf3exTb4b4b4)
Tb4b4b4}
Tb4b4b4}
T8b949e/** Set the radio config (also updates our saved copy in preferences). */
Tff7b72fun Td2a8ffsetChannelsTb4b4b4(Te6edf3channelSetTb4b4b4: Te6edf3AppOnlyProtosTb4b4b4.Te6edf3ChannelSetTb4b4b4) Tff7b72= Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3getChannelListTb4b4b4(Te6edf3channelSetTb4b4b4.Te6edf3settingsListTb4b4b4, Te6edf3channelsTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3settingsListTb4b4b4)Tb4b4b4.Te6edf3forEachTb4b4b4(Tff7b72::Te6edf3setChannelTb4b4b4)
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3replaceAllSettingsTb4b4b4(Te6edf3channelSetTb4b4b4.Te6edf3settingsListTb4b4b4)
Tff7b72val Te6edf3newConfig Tff7b72= Te6edf3config Tb4b4b4{ Te6edf3lora Tff7b72= Te6edf3channelSetTb4b4b4.Te6edf3loraConfig Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3lora Tff7b72!Tff7b72= Te6edf3newConfigTb4b4b4.Te6edf3loraTb4b4b4) Te6edf3setConfigTb4b4b4(Te6edf3newConfigTb4b4b4)
Tb4b4b4}
Tff7b72fun Td2a8ffrefreshProvideLocationTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3setProvideLocationTb4b4b4(Te6edf3getProvidePrefTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffgetProvidePrefTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657Boolean Tff7b72= Te6edf3uiPrefsTb4b4b4.Te6edf3shouldProvideNodeLocationTb4b4b4(Te6edf3myNodeNumTb4b4b4)
Tff7b72private Tff7b72val Te6edf3_provideLocation Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3getProvidePrefTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3provideLocationTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657BooleanTff7b72>
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3_provideLocationTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)
Tff7b72fun Td2a8ffsetProvideLocationTb4b4b4(Te6edf3valueTb4b4b4: Tffa657BooleanTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3uiPrefsTb4b4b4.Te6edf3setShouldProvideNodeLocationTb4b4b4(Te6edf3myNodeNumTb4b4b4, Te6edf3valueTb4b4b4)
Te6edf3_provideLocationTb4b4b4.Te6edf3value Tff7b72= Te6edf3value
Tff7b72if Tb4b4b4(Te6edf3valueTb4b4b4) Tb4b4b4{
Te6edf3meshServiceTff7b72?.Te6edf3startProvideLocationTb4b4b4(Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3meshServiceTff7b72?.Te6edf3stopProvideLocationTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffsetOwnerTb4b4b4(Te6edf3nameTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3user Tff7b72=
Te6edf3ourNodeInfoTb4b4b4.Te6edf3valueTff7b72?.Te6edf3userTff7b72?.Te6edf3copy Tb4b4b4{
Te6edf3longName Tff7b72= Te6edf3name
Te6edf3shortName Tff7b72= Te6edf3getInitialsTb4b4b4(Te6edf3nameTb4b4b4)
Tb4b4b4} Tff7b72?: Tff7b72return
Tff7b72try Tb4b4b4{
T8b949e// Note: we use ?. here because we might be running in the emulator
Te6edf3meshServiceTff7b72?.Te6edf3setRemoteOwnerTb4b4b4(Te6edf3myNodeNum Tff7b72?: Tff7b72returnTb4b4b4, Te6edf3userTb4b4b4.Te6edf3toByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3RemoteExceptionTb4b4b4) Tb4b4b4{
Te6edf3errormsgTb4b4b4(Ta5d6ff"Ta5d6ffCan't set username on device, is device offline? Tffd700${Te6edf3exTb4b4b4.Te6edf3messageTffd700}Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
T8b949e/**
* Export all persisted packet data to a CSV file at the given URI.
*
* The CSV will include all packets, or only those matching the given port number if specified. Each row contains:
* date, time, sender node number, sender name, sender latitude, sender longitude, receiver latitude, receiver
* longitude, receiver elevation, received SNR, distance, hop limit, and payload.
*
* @param uri The destination URI for the CSV file.
* @param filterPortnum If provided, only packets with this port number will be exported.
*/
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffdetekt:CyclomaticComplexMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdetekt:LongMethodTa5d6ff"Tb4b4b4)
Tff7b72fun Td2a8ffsaveDataCsvTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3UriTb4b4b4, Te6edf3filterPortnumTb4b4b4: Tffa657Int? Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3MainTb4b4b4) Tb4b4b4{
T8b949e// Extract distances to this device from position messages and put (node,SNR,distance)
T8b949e// in the file_uri
Tff7b72val Te6edf3myNodeNum Tff7b72= Te6edf3myNodeNum Tff7b72?: Tff7b72returnTf0883e@launch
T8b949e// Capture the current node value while we're still on main thread
Tff7b72val Te6edf3nodes Tff7b72= Te6edf3nodeDBTb4b4b4.Te6edf3nodeDBbyNumTb4b4b4.Te6edf3value
Tff7b72val Te6edf3positionToPosTb4b4b4: Tb4b4b4(Te6edf3MeshProtosTb4b4b4.Te6edf3PositionTff7b72?Tb4b4b4) Tff7b72-Tff7b72> Te6edf3Position? Tff7b72= Tb4b4b4{ Te6edf3meshPosition Tff7b72-Tff7b72>
Te6edf3meshPositionTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3PositionTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}Tb4b4b4.Te6edf3takeIf Tb4b4b4{ Tffa657itTff7b72?.Te6edf3isValidTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Tff7b72true Tb4b4b4}
Tb4b4b4}
Te6edf3writeToUriTb4b4b4(Te6edf3uriTb4b4b4) Tb4b4b4{ Te6edf3writer Tff7b72-Tff7b72>
Tff7b72val Te6edf3nodePositions Tff7b72= Te6edf3mutableMapOfTff7b72<Tffa657IntTb4b4b4, Te6edf3MeshProtosTb4b4b4.Te6edf3PositionTff7b72?Tff7b72>Tb4b4b4(Tb4b4b4)
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffMaxLineLengthTa5d6ff"Tb4b4b4)
Te6edf3writerTb4b4b4.Te6edf3appendLineTb4b4b4(
Ta5d6ff"Ta5d6ff\"Ta5d6ffdateTa5d6ff\"Ta5d6ff,Ta5d6ff\"Ta5d6fftimeTa5d6ff\"Ta5d6ff,Ta5d6ff\"Ta5d6fffromTa5d6ff\"Ta5d6ff,Ta5d6ff\"Ta5d6ffsender nameTa5d6ff\"Ta5d6ff,Ta5d6ff\"Ta5d6ffsender latTa5d6ff\"Ta5d6ff,Ta5d6ff\"Ta5d6ffsender longTa5d6ff\"Ta5d6ff,Ta5d6ff\"Ta5d6ffrx latTa5d6ff\"Ta5d6ff,Ta5d6ff\"Ta5d6ffrx longTa5d6ff\"Ta5d6ff,Ta5d6ff\"Ta5d6ffrx elevationTa5d6ff\"Ta5d6ff,Ta5d6ff\"Ta5d6ffrx snrTa5d6ff\"Ta5d6ff,Ta5d6ff\"Ta5d6ffdistanceTa5d6ff\"Ta5d6ff,Ta5d6ff\"Ta5d6ffhop limitTa5d6ff\"Ta5d6ff,Ta5d6ff\"Ta5d6ffpayloadTa5d6ff\"Ta5d6ff"Tb4b4b4,
Tb4b4b4)
T8b949e// Packets are ordered by time, we keep most recent position of
T8b949e// our device in localNodePosition.
Tff7b72val Te6edf3dateFormat Tff7b72= Te6edf3SimpleDateFormatTb4b4b4(Ta5d6ff"Ta5d6ff\"Ta5d6ffyyyy-MM-ddTa5d6ff\"Ta5d6ff,Ta5d6ff\"Ta5d6ffHH:mm:ssTa5d6ff\"Ta5d6ff"Tb4b4b4, Te6edf3LocaleTb4b4b4.Te6edf3getDefaultTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3meshLogRepositoryTb4b4b4.Te6edf3getAllLogsInReceiveOrderTb4b4b4(Tffa657IntTb4b4b4.Te6edf3MAX_VALUETb4b4b4)Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3packet Tff7b72-Tff7b72>
T8b949e// If we get a NodeInfo packet, use it to update our position data (if valid)
Te6edf3packetTb4b4b4.Te6edf3nodeInfoTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3nodeInfo Tff7b72-Tff7b72>
Te6edf3positionToPosTb4b4b4.Te6edf3invokeTb4b4b4(Te6edf3nodeInfoTb4b4b4.Te6edf3positionTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3nodePositionsTff7b72[Te6edf3nodeInfoTb4b4b4.Te6edf3numTff7b72] Tff7b72= Te6edf3nodeInfoTb4b4b4.Te6edf3position Tb4b4b4}
Tb4b4b4}
Te6edf3packetTb4b4b4.Te6edf3meshPacketTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3proto Tff7b72-Tff7b72>
T8b949e// If the packet contains position data then use it to update, if valid
Te6edf3packetTb4b4b4.Te6edf3positionTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3position Tff7b72-Tff7b72>
Te6edf3positionToPosTb4b4b4.Te6edf3invokeTb4b4b4(Te6edf3positionTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{
Te6edf3nodePositionsTff7b72[
Te6edf3protoTb4b4b4.Te6edf3fromTb4b4b4.Te6edf3takeIf Tb4b4b4{ Tffa657it Tff7b72!Tff7b72= T79c0ff0 Tb4b4b4} Tff7b72?: Te6edf3myNodeNumTb4b4b4,
Tff7b72] Tff7b72= Te6edf3position
Tb4b4b4}
Tb4b4b4}
T8b949e// packets must have rxSNR, and optionally match the filter given as a param.
Tff7b72if Tb4b4b4(
Tb4b4b4(Te6edf3filterPortnum Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3protoTb4b4b4.Te6edf3decodedTb4b4b4.Te6edf3portnumValue Tff7b72=Tff7b72= Te6edf3filterPortnumTb4b4b4) Tff7b72&Tff7b72&
Te6edf3protoTb4b4b4.Te6edf3rxSnr Tff7b72!Tff7b72= T79c0ff0.0f
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3rxDateTime Tff7b72= Te6edf3dateFormatTb4b4b4.Te6edf3formatTb4b4b4(Te6edf3packetTb4b4b4.Te6edf3received_dateTb4b4b4)
Tff7b72val Te6edf3rxFrom Tff7b72= Te6edf3protoTb4b4b4.Te6edf3fromTb4b4b4.Te6edf3toUIntTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3senderName Tff7b72= Te6edf3nodesTff7b72[Te6edf3protoTb4b4b4.Te6edf3fromTff7b72]Tff7b72?.Te6edf3userTff7b72?.Te6edf3longName Tff7b72?: Ta5d6ff"Ta5d6ff"
T8b949e// sender lat & long
Tff7b72val Te6edf3senderPosition Tff7b72= Te6edf3nodePositionsTff7b72[Te6edf3protoTb4b4b4.Te6edf3fromTff7b72]
Tff7b72val Te6edf3senderPos Tff7b72= Te6edf3positionToPosTb4b4b4.Te6edf3invokeTb4b4b4(Te6edf3senderPositionTb4b4b4)
Tff7b72val Te6edf3senderLat Tff7b72= Te6edf3senderPosTff7b72?.Te6edf3latitude Tff7b72?: Ta5d6ff"Ta5d6ff"
Tff7b72val Te6edf3senderLong Tff7b72= Te6edf3senderPosTff7b72?.Te6edf3longitude Tff7b72?: Ta5d6ff"Ta5d6ff"
T8b949e// rx lat, long, and elevation
Tff7b72val Te6edf3rxPosition Tff7b72= Te6edf3nodePositionsTff7b72[Te6edf3myNodeNumTff7b72]
Tff7b72val Te6edf3rxPos Tff7b72= Te6edf3positionToPosTb4b4b4.Te6edf3invokeTb4b4b4(Te6edf3rxPositionTb4b4b4)
Tff7b72val Te6edf3rxLat Tff7b72= Te6edf3rxPosTff7b72?.Te6edf3latitude Tff7b72?: Ta5d6ff"Ta5d6ff"
Tff7b72val Te6edf3rxLong Tff7b72= Te6edf3rxPosTff7b72?.Te6edf3longitude Tff7b72?: Ta5d6ff"Ta5d6ff"
Tff7b72val Te6edf3rxAlt Tff7b72= Te6edf3rxPosTff7b72?.Te6edf3altitude Tff7b72?: Ta5d6ff"Ta5d6ff"
Tff7b72val Te6edf3rxSnr Tff7b72= Te6edf3protoTb4b4b4.Te6edf3rxSnr
T8b949e// Calculate the distance if both positions are valid
Tff7b72val Te6edf3dist Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3senderPos Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3rxPos Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Ta5d6ff"Ta5d6ff"
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3positionToMeterTb4b4b4(
Te6edf3PositionTb4b4b4(Te6edf3rxPositionTff7b72!!Tb4b4b4)Tb4b4b4, T8b949e// Use rxPosition but only if rxPos was
T8b949e// valid
Te6edf3PositionTb4b4b4(Te6edf3senderPositionTff7b72!!Tb4b4b4)Tb4b4b4, T8b949e// Use senderPosition but only if
T8b949e// senderPos was valid
Tb4b4b4)
Tb4b4b4.Te6edf3roundToIntTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3hopLimit Tff7b72= Te6edf3protoTb4b4b4.Te6edf3hopLimit
Tff7b72val Te6edf3payload Tff7b72=
Tff7b72when Tb4b4b4{
Te6edf3protoTb4b4b4.Te6edf3decodedTb4b4b4.Te6edf3portnumValue Tff7b72!in
Te6edf3setOfTb4b4b4(
Te6edf3PortnumsTb4b4b4.Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APP_VALUETb4b4b4,
Te6edf3PortnumsTb4b4b4.Te6edf3PortNumTb4b4b4.Te6edf3RANGE_TEST_APP_VALUETb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Ta5d6ff"Ta5d6ff<Tffd700${Te6edf3protoTb4b4b4.Te6edf3decodedTb4b4b4.Te6edf3portnumTffd700}Ta5d6ff>Ta5d6ff"
Te6edf3protoTb4b4b4.Te6edf3hasDecodedTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Te6edf3protoTb4b4b4.Te6edf3decodedTb4b4b4.Te6edf3payloadTb4b4b4.Te6edf3toStringUtf8Tb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"Ta5d6ff\"Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff\"Ta5d6ff\"Ta5d6ff"Tb4b4b4)
Te6edf3protoTb4b4b4.Te6edf3hasEncryptedTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Ta5d6ff"Tffd700${Te6edf3protoTb4b4b4.Te6edf3encryptedTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff encrypted bytesTa5d6ff"
Tff7b72else Tff7b72-Tff7b72> Ta5d6ff"Ta5d6ff"
Tb4b4b4}
T8b949e// date,time,from,sender name,sender lat,sender long,rx lat,rx long,rx
T8b949e// elevation,rx
T8b949e// snr,distance,hop limit,payload
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffMaxLineLengthTa5d6ff"Tb4b4b4)
Te6edf3writerTb4b4b4.Te6edf3appendLineTb4b4b4(
Ta5d6ff"Tffd700$Te6edf3rxDateTimeTa5d6ff,Ta5d6ff\"Tffd700$Te6edf3rxFromTa5d6ff\"Ta5d6ff,Ta5d6ff\"Tffd700$Te6edf3senderNameTa5d6ff\"Ta5d6ff,Ta5d6ff\"Tffd700$Te6edf3senderLatTa5d6ff\"Ta5d6ff,Ta5d6ff\"Tffd700$Te6edf3senderLongTa5d6ff\"Ta5d6ff,Ta5d6ff\"Tffd700$Te6edf3rxLatTa5d6ff\"Ta5d6ff,Ta5d6ff\"Tffd700$Te6edf3rxLongTa5d6ff\"Ta5d6ff,Ta5d6ff\"Tffd700$Te6edf3rxAltTa5d6ff\"Ta5d6ff,Ta5d6ff\"Tffd700$Te6edf3rxSnrTa5d6ff\"Ta5d6ff,Ta5d6ff\"Tffd700$Te6edf3distTa5d6ff\"Ta5d6ff,Ta5d6ff\"Tffd700$Te6edf3hopLimitTa5d6ff\"Ta5d6ff,Ta5d6ff\"Tffd700$Te6edf3payloadTa5d6ff\"Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72suspend Tff7b72inline Tff7b72fun Td2a8ffwriteToUriTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3UriTb4b4b4, Te6edf3crossinline Te6edf3blockTb4b4b4: Te6edf3suspend Tb4b4b4(Te6edf3BufferedWriterTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Te6edf3withContextTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3IOTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3appTb4b4b4.Te6edf3contentResolverTb4b4b4.Te6edf3openFileDescriptorTb4b4b4(Te6edf3uriTb4b4b4, Ta5d6ff"Ta5d6ffwtTa5d6ff"Tb4b4b4)Tff7b72?.Te6edf3use Tb4b4b4{ Te6edf3parcelFileDescriptor Tff7b72-Tff7b72>
Te6edf3FileWriterTb4b4b4(Te6edf3parcelFileDescriptorTb4b4b4.Te6edf3fileDescriptorTb4b4b4)Tb4b4b4.Te6edf3use Tb4b4b4{ Te6edf3fileWriter Tff7b72-Tff7b72>
Te6edf3BufferedWriterTb4b4b4(Te6edf3fileWriterTb4b4b4)Tb4b4b4.Te6edf3use Tb4b4b4{ Te6edf3writer Tff7b72-Tff7b72> Te6edf3blockTb4b4b4.Te6edf3invokeTb4b4b4(Te6edf3writerTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3exTb4b4b4: Te6edf3FileNotFoundExceptionTb4b4b4) Tb4b4b4{
Te6edf3errormsgTb4b4b4(Ta5d6ff"Ta5d6ffCan't write file error: Tffd700${Te6edf3exTb4b4b4.Te6edf3messageTffd700}Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffaddQuickChatActionTb4b4b4(Te6edf3actionTb4b4b4: Te6edf3QuickChatActionTb4b4b4) Tff7b72=
Te6edf3viewModelScopeTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3IOTb4b4b4) Tb4b4b4{ Te6edf3quickChatActionRepositoryTb4b4b4.Te6edf3upsertTb4b4b4(Te6edf3actionTb4b4b4) Tb4b4b4}
Tff7b72fun Td2a8ffdeleteQuickChatActionTb4b4b4(Te6edf3actionTb4b4b4: Te6edf3QuickChatActionTb4b4b4) Tff7b72=
Te6edf3viewModelScopeTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3IOTb4b4b4) Tb4b4b4{ Te6edf3quickChatActionRepositoryTb4b4b4.Te6edf3deleteTb4b4b4(Te6edf3actionTb4b4b4) Tb4b4b4}
Tff7b72fun Td2a8ffupdateActionPositionsTb4b4b4(Te6edf3actionsTb4b4b4: Te6edf3ListTff7b72<Te6edf3QuickChatActionTff7b72>Tb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3IOTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Te6edf3position Tff7b72in Te6edf3actionsTb4b4b4.Te6edf3indicesTb4b4b4) Tb4b4b4{
Te6edf3quickChatActionRepositoryTb4b4b4.Te6edf3setItemPositionTb4b4b4(Te6edf3actionsTff7b72[Te6edf3positionTff7b72]Tb4b4b4.Te6edf3uuidTb4b4b4, Te6edf3positionTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3tracerouteResponseTb4b4b4: Te6edf3LiveDataTff7b72<Tffa657String?Tff7b72>
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3tracerouteResponseTb4b4b4.Te6edf3asLiveDataTb4b4b4(Tb4b4b4)
Tff7b72fun Td2a8ffclearTracerouteResponseTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3clearTracerouteResponseTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72fun Td2a8ffsetNodeFilterTextTb4b4b4(Te6edf3textTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3nodeFilterTextTb4b4b4.Te6edf3value Tff7b72= Te6edf3text
Tb4b4b4}
T8b949e// region Main menu actions logic
Tff7b72private Tff7b72val Te6edf3_showAppIntroTb4b4b4: Te6edf3MutableStateFlowTff7b72<Tffa657BooleanTff7b72> Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Tff7b72!Te6edf3uiPrefsTb4b4b4.Te6edf3appIntroCompletedTb4b4b4)
Tff7b72val Te6edf3showAppIntroTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657BooleanTff7b72> Tff7b72= Te6edf3_showAppIntroTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)
Tff7b72fun Td2a8ffshowAppIntroTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3_showAppIntroTb4b4b4.Te6edf3update Tb4b4b4{ Tff7b72true Tb4b4b4}
Tb4b4b4}
T8b949e// endregion
Tff7b72fun Td2a8ffonAppIntroCompletedTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3uiPrefsTb4b4b4.Te6edf3appIntroCompleted Tff7b72= Tff7b72true
Te6edf3_showAppIntroTb4b4b4.Te6edf3update Tb4b4b4{ Tff7b72false Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.23s